import java.lang.reflect.Method;



import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * @Author: linzp
 * @Date: 2021/10/28/14:29
 */
public class demo3 {

    //用户管理接口
    public static interface UserManager {
        //新增用户抽象方法
        void addUser(String userName,String password);
        //删除用户抽象方法
        void delUser(String userName);

    }

    //用户管理实现类,实现用户管理接口
    public static class UserManagerImpl implements UserManager{
        //重写新增用户方法
        @Override
        public void addUser(String userName, String password) {
            System.out.println("调用了新增的方法！");
            System.out.println("传入参数为 userName: "+userName+" password: "+password);
        }
        //重写删除用户方法
        @Override
        public void delUser(String userName) {
            System.out.println("调用了删除的方法！");
            System.out.println("传入参数为 userName: "+userName);
        }

    }


    //Cglib动态代理，实现MethodInterceptor接口
    public static class CglibProxy implements MethodInterceptor {
        private Object target;//需要代理的目标对象

        //重写拦截方法
        @Override
        public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {
            System.out.println("Cglib动态代理，监听开始！");
            Object invoke = method.invoke(target, arr);//方法执行，参数：target 目标对象 arr参数数组
            System.out.println("Cglib动态代理，监听结束！");
            return invoke;
        }
        //定义获取代理对象方法
        public Object getCglibProxy(Object objectTarget){
            //为目标对象target赋值
            this.target = objectTarget;
            Enhancer enhancer = new Enhancer();
            //设置父类,因为Cglib是针对指定的类生成一个子类，所以需要指定父类
            enhancer.setSuperclass(objectTarget.getClass());
            enhancer.setCallback(this);// 设置回调
            Object result = enhancer.create();//创建并返回代理对象
            return result;
        }

        public static void main(String[] args) {
            CglibProxy cglib = new CglibProxy();//实例化CglibProxy对象
            UserManager user =  (UserManager) cglib.getCglibProxy(new UserManagerImpl());//获取代理对象
            user.delUser("admin");//执行删除方法
        }


    }
}
